﻿using System;
namespace AsyncWinForm
{
    public  class GuidExtension
    {
        [System.Runtime.InteropServices.DllImport("rpcrt4.dll", SetLastError = true)]
        private static extern int UuidCreateSequential(out Guid guid);

        public static Guid NewSequentialGuid()
        {
            const int RPC_S_OK = 0;
            Guid guid;
            int result = UuidCreateSequential(out  guid);

            if (result != RPC_S_OK)
            {
                throw new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error());
            }
            else
            {
                byte[] guidBytes = guid.ToByteArray();
                Array.Reverse(guidBytes, 0, 4);
                Array.Reverse(guidBytes, 4, 2);
                Array.Reverse(guidBytes, 6, 2);

                long timestamp = DateTime.UtcNow.Ticks / 10000L;
                byte[] timestampBytes = BitConverter.GetBytes(timestamp);

                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(timestampBytes);
                }
                Buffer.BlockCopy(timestampBytes, 2, guidBytes, 10, 6);
                return new Guid(guidBytes);
            }
             
           
        }
    }

}
